package cn.ant.Client;


import cn.ant.utils.ChannelUtil;
import com.rabbitmq.client.Channel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 消费者B（消费任务）
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
public class ConsumerB {

    // 通过日志管理器获取Logger对象
    static Logger logger = LogManager.getLogger(ConsumerB.class);
    // 工作队列名称（消息分发测试）
    public static final String QUEUE_NAME = "QueuesMessageDistribution";

    public static void main(String[] args) throws IOException {
        // 调用自己的工具类获取信道
        Channel channel = ChannelUtil.getChannel();
        // 创建队列，以防启动消费者发现队列不存在报错
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 信道设置分发规则（预取值）
        // 设置0代表轮询分发、1不公平分发、大于1代表预取值
        // 设置1可以代表不公平分发，执行完手动确认后，队列才会分配下一个消息处理
        channel.basicQos(1);
        // 代表当前消费者B的信道堆积的未处理的消息数 量
        // channel.basicQos(5);

        logger.info("消费者B开始监听队列消息....");
        // 应答方式：true自动应答、false手动应答（若是手动应答必须设置false）
        boolean autoAck = false;
        // 消费者消费消息
        channel.basicConsume(QUEUE_NAME, autoAck, (consumerTag, message) -> {
            // 手动添加程序睡眠时长（模拟程序执行过程）
            try {
                Thread.sleep(10000);
                logger.info("========================================================");
                logger.info("B消费者获取队列信息并用时10秒完成处理：{}",
                        new String(message.getBody(), StandardCharsets.UTF_8));
                // 手动确认应答 不批量应答
                channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
            } catch (InterruptedException e) {
                logger.info("消息消费失败，错误信息：{}", e.getMessage());
                // 出现异常手动进行不应答；并且重新放入到队列中
                channel.basicReject(message.getEnvelope().getDeliveryTag(), true);
            }
        }, consumerTag -> {
            logger.info("监听的队列出现异常；可能队列被删除！{}", consumerTag);
        });
    }
}